package beer.xz.beer.device.comm.test

import beer.xz.beer.device.comm.protocol.BeerProtocolImpl
import java.nio.ByteBuffer
import java.nio.ByteOrder

/**
 * 啤酒机协议测试类
 * 用于测试协议解析功能
 */
object BeerProtocolTest {
    /**
     * 生成测试数据包
     * @return 测试数据包字节数组
     */
    fun generateTestPacket(): ByteArray {
        val buffer = ByteBuffer.allocate(BeerProtocolImpl.TOTAL_PACKET_SIZE)
        buffer.order(ByteOrder.LITTLE_ENDIAN)

        // 头部 (0x0F)
        buffer.put(BeerProtocolImpl.HEADER_BYTE)

        // 数据长度 (固定180字节)
        buffer.put(0.toByte())  // 最高字节
        buffer.put(0.toByte())  // 高字节
        buffer.put(180.toByte())  // 低字节

        // 温度 (25°C)
        buffer.put(25.toByte())

        // 重量数据
        buffer.putFloat(5.5f)  // 酒瓶重量
        buffer.putFloat(0.8f)  // 出酒量
        buffer.putFloat(1.2f)  // 罐装酒瓶压力
        buffer.putFloat(2.5f)  // 二氧化碳压强

        // 电机和流量数据
        buffer.putFloat(10.0f)  // 电机行程量
        buffer.putFloat(15.0f)  // 流量计数

        // 保留字段 (8字节)
        buffer.putFloat(0.0f)
        buffer.putFloat(0.0f)

        // 运行时间 (1小时 = 3600000毫秒)
        buffer.putInt(3600000)

        // 填充保留字段 (76字节)
        for (i in 0 until 19) {
            buffer.putFloat(0.0f)
        }

        // 输入开关标志位 (10个4字节长整型 = 40字节)
        for (i in 0 until 10) {
            buffer.putInt(i)
        }

        // 故障码
        buffer.putInt(0)  // 硬件故障码
        buffer.putInt(0)  // 软件故障码

        // 设备信息
        buffer.putInt(12345)  // 设备ID
        buffer.putInt(10000)  // 软件版本
        buffer.putInt(20000)  // 硬件版本

        // 标志位
        buffer.put(1.toByte())  // 继电器输出标志位
        buffer.put(0.toByte())  // 保留
        buffer.put(1.toByte())  // 运行标志位
        buffer.put(0.toByte())  // 保留
        buffer.put(0.toByte())  // 数据类型 (0=测试数据)

        // 计算校验和
        val data = buffer.array()
        var sum = 0
        // 从第2个字节开始（索引1），到校验和字段前一个字节结束
        for (i in 1 until BeerProtocolImpl.OFFSET_CHECKSUM) {
            sum += data[i].toInt() and 0xFF
        }
        buffer.position(BeerProtocolImpl.OFFSET_CHECKSUM)
        buffer.put((sum and 0xFF).toByte())  // 校验和

        // 打印校验和信息（调试用）
        println("crc: 0x${(sum and 0xFF).toString(16)}")

        // 尾部
        buffer.put(BeerProtocolImpl.TAIL_BYTE1)
        buffer.put(BeerProtocolImpl.TAIL_BYTE2)

        return buffer.array()
    }

    /**
     * 测试协议解析
     */
    fun testProtocol() {
        val testData = generateTestPacket()
        val protocol = BeerProtocolImpl()
        val result = protocol.decodeData(testData)

        if (result != null) {
            println("解析成功:")
            println("温度: ${result.temperature}°C")
            println("酒瓶重量: ${result.beerBottleWeight}kg")
            println("出酒量: ${result.outputBeerWeight}kg")
            println("罐装酒瓶压力: ${result.bottlePressure}kg")
            println("二氧化碳压强: ${result.co2Pressure}kg")
            println("电机行程量: ${result.motorPosition}")
            println("流量计数: ${result.flowCount}")
            println("运行时间: ${result.runningTimeMs}ms")
            println("设备ID: ${result.deviceId}")
            println("软件版本: ${result.softwareVersion}")
            println("硬件版本: ${result.hardwareVersion}")
            println("运行标志位: ${result.runningFlag}")
        } else {
            println("解析失败")
        }
    }
}
